home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BUTTEST.ZIP / MOUSE.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-26  |  9KB  |  328 lines

  1.  
  2.                     {MOUSE.PAS creates MOUSE.TPU Unit}
  3.      {From the book "OBJECT ORIENTED PROGRAMMING IN TURBO PASCAL 5.5"}
  4.  
  5. Unit Mouse;
  6.  
  7. Interface
  8.  
  9. Uses
  10.     Cursors;            {Contains Type GCursor = record and other cursors}
  11.                         {Really contains all of the cursors, must have   }
  12.                         {to compile and use this unit.  Edit out the     }
  13.                         {cursors from CURSORS.PAS and recompile if there }
  14.                         {are some you don't want to include in you       }
  15.                         {application. Will save some space in code...    }
  16.  
  17. Type
  18.     Position = record
  19.              btnStat,
  20.              opCount,
  21.              Xpos,Ypos : integer;
  22.              end; {record}
  23.  
  24. Const
  25.      ButtonL = 0;
  26.      ButtonR = 1;
  27.      ButtonM = 2;
  28.      Software = 0;
  29.      Hardware = 1;
  30.  
  31.      
  32. Type
  33.     GenMouse = object
  34.              X,Y : integer;
  35.              Visible : boolean;
  36.              Function TestMouse : boolean;
  37.              Procedure SetAccel(Threshold : integer);
  38.              Procedure Show(Option : boolean);
  39.              Procedure GetPosition(var BtnStatus,Xpos,Ypos : integer);
  40.              Procedure QueryBtnDn(Button : integer;var mouse : position);
  41.              Procedure QueryBtnUp(Button : integer;var mouse : position);
  42.              Procedure ReadMove(var XMove,YMove : integer);
  43.              Procedure Reset(var Status : boolean;var BtnCount : integer);
  44.              Procedure SetRatio(HorPix,VerPix : integer);
  45.              Procedure SetLimits(XPosMin,YPosMin,XPosMax,YPosMax : integer);
  46.              Procedure SetPosition(XPos,YPos : integer);
  47.              end; {object}
  48.  
  49.     GraphicMouse = object(GenMouse)
  50.                  Procedure Initialize;
  51.                  Procedure ConditionalHide(Left,Top,Right,Bottom : integer);
  52.                  Procedure SetCursor(Cursor : GCursor);
  53.                  end; {object}
  54.  
  55.     TextMouse = object(GenMouse)
  56.               Procedure Initialize;
  57.               Procedure SetCursor(Ctype,C1,C2 : word);
  58.               end; {object}
  59.  
  60.     GraphicLightPen = object(GraphicMouse)
  61.                     Procedure LightPen(Option : boolean);
  62.                     end; {object}
  63.  
  64.     TextLightPen = object(TextMouse)
  65.                  Procedure LightPen(Option : boolean);
  66.                  end; {object}
  67.  
  68. {=========================================================================}
  69.  
  70. Implementation
  71.  
  72. Uses
  73.     Crt,Graph,Dos;
  74. Var
  75.    Regs : registers;
  76.  
  77. {*************************************************************************}
  78.  
  79. Function Lower(N1,N2 : integer) : integer;
  80. Begin
  81.      if N1 < N2 then
  82.         Lower := N1
  83.      else
  84.          Lower := N2;
  85. End;
  86.  
  87. {*************************************************************************}
  88.  
  89. Function Upper(N1,N2 : integer) : integer;
  90. Begin
  91.      if N1 > N2 then
  92.         Upper := N1
  93.      else
  94.          Upper := N2;
  95. End;
  96.  
  97. {*************************************************************************}
  98.  
  99. Function GenMouse.TestMouse : boolean;
  100. Const
  101.      Iret = 207;
  102. Var
  103.    dOff,dSeg : integer;
  104. Begin
  105.      dOff := MemW[0000:0204];
  106.      dSeg := MemW[0000:0206];
  107.      if ((dSeg = 0) or (dOff = 0)) then
  108.         TestMouse := False
  109.      else
  110.          TestMouse := Mem[dSeg:dOff] <> Iret;
  111. End;
  112.  
  113. {*************************************************************************}
  114.  
  115. Procedure GenMouse.Reset(var Status : boolean; var BtnCount : integer);
  116. Begin
  117.      Regs.AX := $00;            {Reset to default conditions}
  118.      intr($33,Regs);
  119.      Status := Regs.AX <> 0;    {Mouse Present}
  120.      BtnCount := Regs.BX;       {Button Count}
  121. End;
  122.  
  123. {*************************************************************************}
  124.  
  125. Procedure GenMouse.SetAccel(Threshold : integer);
  126. Begin
  127.      Regs.AX := $13;
  128.      Regs.DX := Threshold;
  129.      Intr($33,Regs);
  130. End;
  131.  
  132. {*************************************************************************}
  133.  
  134. Procedure GenMouse.Show(Option : boolean);
  135. Begin
  136.      if Option and not Visible then
  137.      begin
  138.           Regs.AX := $01;         {Show mouse cursor}
  139.           Visible := True;
  140.           Intr($33,Regs);
  141.      end
  142.      else
  143.      if Visible and not Option then
  144.      begin
  145.           Regs.AX := $02;           {Hide mouse cursor}
  146.           Visible := False;
  147.           Intr($33,Regs);
  148.      end;
  149. End;
  150.  
  151. {*************************************************************************}
  152.  
  153. Procedure GenMouse.GetPosition(var BtnStatus,Xpos,Ypos : integer);
  154. Begin
  155.      Regs.AX := $03;
  156.      Intr($33,Regs);
  157.      BtnStatus := Regs.BX;
  158.      Xpos      := Regs.CX;
  159.      Ypos      := Regs.DX;
  160. End;
  161.  
  162. {*************************************************************************}
  163.  
  164. Procedure GenMouse.SetPosition(Xpos,Ypos : integer);
  165. Begin
  166.      Regs.AX := $04;
  167.      Regs.CX := Xpos;
  168.      Regs.DX := Ypos;
  169.      Intr($33,Regs);
  170. End;
  171.  
  172. {*************************************************************************}
  173.  
  174. Procedure GenMouse.SetRatio(HorPix,VerPix : integer);
  175. Begin
  176.      Regs.AX := $0F;
  177.      Regs.CX := HorPix;         {horizonal mickeys/pixel}
  178.      Regs.DX := VerPix;         {vertical mickeys/pixel}
  179.      Intr($33,Regs);
  180. End;
  181.  
  182. {*************************************************************************}
  183.  
  184. Procedure GenMouse.QueryBtnDn(Button : integer;var Mouse : position);
  185. Begin
  186.      Regs.AX := $05;
  187.      Regs.BX := Button;
  188.      Intr($33,Regs);
  189.      Mouse.BtnStat := Regs.AX;
  190.      Mouse.OpCount := Regs.BX;
  191.      Mouse.Xpos    := Regs.CX;
  192.      Mouse.Ypos    := Regs.DX;
  193. End;
  194.  
  195. {*************************************************************************}
  196.  
  197. Procedure GenMouse.QueryBtnUp(Button : integer;var Mouse : position);
  198. Begin
  199.      Regs.AX := $06;
  200.      Regs.BX := Button;
  201.      Intr($33,Regs);
  202.      Mouse.BtnStat := Regs.AX;
  203.      Mouse.OpCount := Regs.BX;
  204.      Mouse.Xpos    := Regs.CX;
  205.      Mouse.Ypos    := Regs.DX;
  206. End;
  207.  
  208. {*************************************************************************}
  209.  
  210. Procedure GenMouse.SetLimits(XPosMin,YPosMin,XPosMax,YPosMax : integer);
  211. Begin
  212.      Regs.AX := $07;    {horizonal limits}
  213.      Regs.CX := Lower(XPosMin,XPosMax);
  214.      Regs.DX := Upper(XPosMin,XPosMax);
  215.      Intr($33,Regs);
  216.      Regs.AX := $08;    {vertical limits}
  217.      Regs.CX := Lower(YPosMin,YPosMax);
  218.      Regs.DX := Upper(YPosMin,YPosMax);
  219.      Intr($33,Regs);
  220. End;
  221.  
  222. {*************************************************************************}
  223.  
  224. Procedure GenMouse.ReadMove(var XMove,YMove : integer);
  225. Begin
  226.      Regs.AX := $0B;
  227.      Intr($33,Regs);
  228.      XMove := Regs.CX;
  229.      YMove := Regs.DX;
  230. End;
  231.  
  232. {*************************************************************************}
  233.  
  234.              {=======================================}
  235.              {Implementation methods for GraphicMouse}
  236.              {=======================================}
  237.  
  238. Procedure GraphicMouse.SetCursor(Cursor : GCursor);
  239. Begin
  240.      Regs.AX := $09;
  241.      Regs.BX := Cursor.HotX;
  242.      Regs.CX := Cursor.HotY;
  243.      Regs.DX := Ofs(Cursor.ScreenMask);
  244.      Regs.ES := Seg(Cursor.ScreenMask);
  245.      Intr($33,Regs);
  246. End;
  247.  
  248. {*************************************************************************}
  249.  
  250. Procedure GraphicMouse.ConditionalHide(Left,Top,Right,Bottom : integer);
  251. Begin
  252.      Regs.AX := $0A;
  253.      Regs.CX := Left;
  254.      Regs.DX := Top;
  255.      Regs.SI := Right;
  256.      Regs.DI := Bottom;
  257.      Intr($33,Regs);
  258. End;
  259.  
  260. {*************************************************************************}
  261.  
  262. Procedure GraphicMouse.Initialize;
  263. Begin
  264.      Visible := False;
  265.      SetLimits(0,0,GetMaxX,GetMaxY);
  266.      SetCursor(Arrow);
  267.      SetPosition(GetMaxX div 2,GetMaxY div 2);
  268.      Show(True);
  269. End;
  270.  
  271. {*************************************************************************}
  272.  
  273.                     {====================================}
  274.                     {Implementation methods for TextMouse}
  275.                     {====================================}
  276.  
  277. Procedure TextMouse.Initialize;
  278. Begin
  279.      Visible := False;
  280.      SetLimits(Lo(WindMin)*8,Hi(WindMin)*8,Lo(WindMax)*8,Hi(WindMax)*8);
  281.      SetCursor(Hardware,6,7);
  282.      SetPosition(0,0);
  283.      Show(True);
  284. End;
  285.  
  286. {*************************************************************************}
  287.  
  288. Procedure TextMouse.SetCursor(CType,C1,C2 : word);
  289. Begin
  290.      Regs.AX := $0A;            {function 10h}
  291.      Regs.BX := CType;          {0=software,1=hardware}
  292.      Regs.CX := C1;             {screen mask or scan start line}
  293.      Regs.DX := C2;             {screen mask or scan stop line}
  294.      Intr($33,Regs);
  295. End;
  296.  
  297. {*************************************************************************}
  298.  
  299.              {===================================}
  300.              {Implementation methods for LightPen}
  301.              {===================================}
  302.  
  303. Procedure TextLightPen.LightPen(Option : boolean);
  304. Begin
  305.      if Option then
  306.         Regs.AX := $0D
  307.      else
  308.          Regs.AX := $0E;
  309.      Intr($33,Regs);
  310. End;
  311.  
  312. {*************************************************************************}
  313.  
  314. Procedure GraphicLightPen.LightPen(Option : boolean);
  315. Begin
  316.      if Option then
  317.         Regs.AX := $0D
  318.      else
  319.          Regs.AX := $0E;
  320.      Intr($33,Regs);
  321. End;
  322.  
  323. {*************************************************************************}
  324.  
  325. BEGIN
  326. END.
  327.  
  328.